require "import"
import "android.content.Context"
import "android.os.Vibrator"
import "android.widget.*"
import "com.androlua.*"
import "android.text.Html"
import "java.net.URLEncoder"
import "java.util.Locale"
import "android.graphics.Color"

local context = activity or service
local vibrator = context.getSystemService(Context.VIBRATOR_SERVICE)
vibrator.vibrate(200)

local languageCodes = {
    ["#7 باكستان الأردية"] = "ur",
    ["السندهية"] = "sd",
    ["البشتو"] = "ps",
    ["البلوشية"] = "bal",
    ["السرائيكية"] = "skr",
    ["البراهوية"] = "brh",
    ["#1 الهندية"] = "hi",
    ["البنغالية الهند"] = "bn",
    ["التيلجو"] = "te",
    ["#4 الماراثية"] = "mr",
    ["التاميل"] = "ta",
    ["#3 الأردية الهند"] = "ur",
    ["#6 الغوجاراتية"] = "gu",
    ["المالايالام"] = "ml",
    ["الكانادا"] = "kn",
    ["الأوريا"] = "or",
    ["#5 البنجابية الهند"] = "pa",
    ["الأسامية"] = "as",
    ["المايثيلية"] = "mai",
    ["السانتالية"] = "sat",
    ["البنغالية بنغلاديش"] = "bn",
    ["الشيتاغونغية"] = "ctg",
    ["السيلهيتية"] = "syl",
    ["الروهينغية"] = "rhg",
    ["الصينية الماندارين"] = "zh",
    ["الكانتونية"] = "yue",
    ["الصينية الوو (الشنگهاي)"] = "wuu",
    ["الهاكا"] = "hak",
    ["المين نان (الهوكيين)"] = "nan",
    ["العربية"] = "ar",
    ["الفارسية"] = "fa",
    ["الكردية"] = "ku",
    ["الدارية"] = "prs",
    ["البشتو أفغانستان"] = "ps",
    ["العبرية"] = "he",
    ["#2 الإنجليزية"] = "en",
    ["الفرنسية"] = "fr",
    ["الألمانية"] = "de",
    ["الإسبانية"] = "es",
    ["الإيطالية"] = "it",
    ["البرتغالية"] = "pt",
    ["الهولندية"] = "nl",
    ["الروسية"] = "ru",
    ["اليونانية"] = "el",
    ["البولندية"] = "pl",
    ["الأوكرانية"] = "uk",
    ["التشيكية"] = "cs",
    ["المجرية"] = "hu",
    ["السويدية"] = "sv",
    ["الدانماركية"] = "da",
    ["الفنلندية"] = "fi",
    ["النرويجية"] = "no",
    ["الرومانية"] = "ro",
    ["البلغارية"] = "bg",
    ["الصربية"] = "sr",
    ["الكرواتية"] = "hr",
    ["السلوفاكية"] = "sk",
    ["السلوفينية"] = "sl",
    ["السواحيلية"] = "sw",
    ["الهوسا"] = "ha",
    ["اليوروبا"] = "yo",
    ["الإيغبو"] = "ig",
    ["الأمهرية"] = "am",
    ["الزولو"] = "zu",
    ["الخوسا"] = "xh",
    ["الصومالية"] = "so",
    ["الأفريكانية"] = "af",
    ["الإندونيسية"] = "id",
    ["الملايو"] = "ms",
    ["التايلاندية"] = "th",
    ["الفيتنامية"] = "vi",
    ["الفلبينية (التاغالوغ)"] = "tl",
    ["البورمية"] = "my",
    ["الخميرية (الكمبودية)"] = "km",
    ["اللاو"] = "lo",
    ["الكيتشوا"] = "qu",
    ["الغواراني"] = "gn",
    ["الكريولية الهايتية"] = "ht",
    ["المايا (اليوكاتيك)"] = "yua",
    ["النافاجو"] = "nv",
}

local items = {}
for language, code in pairs(languageCodes) do
    table.insert(items, language)
end
table.sort(items)

function capitalizeFirstWord(str)
    return str:gsub("^%l", string.upper)
end

function addPunctuation(str)
    return str .. "."
end

function hasInternetConnection()
    local connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE)
    local networkInfo = connectivityManager.getActiveNetworkInfo()
    return networkInfo ~= nil and networkInfo.isConnected()
end

if not hasInternetConnection() then
    local noInternet = LuaDialog()
    noInternet.setTitle("مشكلة في الإنترنت")
    noInternet.setMessage("لا يوجد اتصال بالإنترنت. لا يمكن ترجمة اللغة")
    noInternet.setButton("موافق", nil)
    vibrator.vibrate(800)
    noInternet.show()
    return false 
end

local function splitTextIntoChunks(text, maxChunkSize)
    local chunks = {}
    for i = 1, #text, maxChunkSize do
        table.insert(chunks, text:sub(i, i + maxChunkSize - 1))
    end
    return chunks
end

-- دالة الترجمة والنطق المباشر دون فتح نافذة نتائج
local function performSilentTranslation(text, languageCode)
    local MAX_CHUNK_SIZE = 5000
    local chunks = splitTextIntoChunks(text, MAX_CHUNK_SIZE)
    local translatedChunks = {}
    local completedChunks = 0

    for index, chunk in ipairs(chunks) do
        local defaultLanguage = Locale.getDefault().getLanguage()
        local encodedChunk = URLEncoder.encode(chunk, "UTF-8")
        local url = "https://translate.google.com/m?sl=auto&hl=" .. defaultLanguage .. 
                   "&q=" .. encodedChunk .. "&tl=" .. languageCode

        Http.get(url, function(status, result)
            if status == 200 then
                local translation = result:match('<div class="result%-container">([^<]+)</div>')
                if translation then
                    translation = tostring(Html.fromHtml(translation))
                    translation = capitalizeFirstWord(translation)
                    translation = addPunctuation(translation)
                    
                    translatedChunks[index] = translation
                    completedChunks = completedChunks + 1

                    if completedChunks == #chunks then
                        local fullTranslation = table.concat(translatedChunks, " ")
                        
                        -- نطق الترجمة مباشرة بصوت قارئ الشاشة واهتزاز للتأكيد
                        vibrator.vibrate(100)
                        service.speak(fullTranslation)
                    end
                else
                    service.speak("فشل استخراج الترجمة")
                end
            else
                service.speak("خطأ في الاتصال بالسيرفر")
            end
        end)
    end
end

-- تصميم الواجهة الأولى المطلوبة
local layout = {
    LinearLayout;
    layout_width = "fill";
    layout_height = "fill";
    orientation = "vertical";
    padding = "16dp";
    {
        TextView;
        text = "ترجمة جوجل";
        textColor = Color.WHITE;
        textSize = "24sp";
        gravity = "center";
        layout_width = "fill";
    };
    {
        TextView;
        text = "تم تطويره بواسطة سايح فتحي";
        textColor = Color.LTGRAY;
        textSize = "14sp";
        gravity = "center";
        layout_width = "fill";
        layout_marginBottom = "10dp";
    };
    {
        EditText,
        id = "searchBox";
        layout_width = "fill";
        layout_height = "wrap";
        hint = "البحث عن لغة";
    };
    {
        ListView,
        id = "grid";
        layout_width = "fill";
        layout_height = "0dp";
        layout_weight = 1;
    },
    {
        ScrollView,
        layout_width = "fill";
        {
            LinearLayout;
            layout_width = "fill";
            layout_height = "wrap";
            orientation = "horizontal";
            gravity = "center";
            {
                Button,
                id = "exitButton";
                text = "إلغاء";
                layout_width = "wrap_content";
            }
        }
    }
}

dlg = LuaDialog(context)
dlg.View = loadlayout(layout)

local adapter = ArrayAdapter(service, android.R.layout.simple_list_item_1, items)
_G.grid.adapter = adapter

dlg.show()

_G.searchBox.addTextChangedListener{
    onTextChanged = function(s, start, before, count)
        local keyword = s.toString()
        local filteredItems = {}
        for _, language in ipairs(items) do
            if language:lower():find(keyword:lower()) then
                table.insert(filteredItems, language)
            end
        end
        local totalFilter = #filteredItems
        service.postSpeak(10, "تم تصفية " .. tostring(totalFilter) .. " لغة")
        adapter.clear()
        adapter.addAll(filteredItems)
        adapter.notifyDataSetChanged()
    end
}

_G.grid.onItemClick = function(l, v, s)
    dlg.dismiss() -- إغلاق القائمة فوراً عند اختيار اللغة
    task(1, function()
        local language = v.text
        local languageCode = languageCodes[language]

        if languageCode then
            local textToTranslate = tostring(node.Text or "")
            if textToTranslate ~= "" then
                -- البدء بالترجمة والنطق مباشرة دون فتح نافذة أخرى
                performSilentTranslation(textToTranslate, languageCode)
            else
                service.speak("النص المحدد فارغ!")
            end
        else
            service.speak("اللغة غير مدعومة")
        end
    end)
end

_G.exitButton.onClick = function()
    service.playSoundTick()
    dlg.dismiss()
end
